package cn.itcast.reflect;

import cn.itcast.domain.Person;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 获取成员变量
 */
public class ReflectDemo2 {

    //显然无论怎么反射
    //第一件事都是先获得字节码文件对象

    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, NoSuchMethodException {

        //1.获取成员变量
        Class personClass = Person.class ;

        //1.getFields()     获取所有public成员变量
        for (Field field : personClass.getFields()) {
            System.out.println(field);
        }

        //2.getField()      根据名称获取 ， 也是智能获取public
//        Field name = personClass.getField("name");
//        System.out.println(name);

        //获取这个变量后就可以操作这个对象
        //有get方法和set方法
        Field username = personClass.getField("username");

        Person person = new Person() ;
        //前面拿到的只是这个类型
        //调用get方法时还要传参告诉你想获得哪个对象里的username值
        String username_ = (String) username.get(person);
        System.out.println(username_);

        //set设置也是 ， 要制定一个对象告诉你要操作哪个对象的字段的值
        username.set(person , "二比");
        System.out.println(person);

        //3.getDeclaredField()      什么类型的都可以获取
        Method[] declaredMethods = personClass.getDeclaredMethods();
        System.out.println(declaredMethods);

        //访问私有对象的值

        Field name = personClass.getDeclaredField("name");
        name.setAccessible(true);       //对当前获取到的设置忽略安全检查       -->暴力反射
        String name_ = (String) name.get(person);
        System.out.println(name_);   //私有的不能直接被访问

    }
}
